home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / lib-old / cmp.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  2KB  |  69 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. """Efficiently compare files, boolean outcome only (equal / not equal).
  5.  
  6. Tricks (used in this order):
  7.     - Files with identical type, size & mtime are assumed to be clones
  8.     - Files with different type or size cannot be identical
  9.     - We keep a cache of outcomes of earlier comparisons
  10.     - We don't fork a process to run 'cmp' but read the files ourselves
  11. """
  12. import os
  13. cache = { }
  14.  
  15. def cmp(f1, f2, shallow = 1):
  16.     '''Compare two files, use the cache if possible.
  17.     Return 1 for identical files, 0 for different.
  18.     Raise exceptions if either file could not be statted, read, etc.'''
  19.     s1 = sig(os.stat(f1))
  20.     s2 = sig(os.stat(f2))
  21.     if s1[0] != 8 or s2[0] != 8:
  22.         return 0
  23.     
  24.     if shallow and s1 == s2:
  25.         return 1
  26.     
  27.     if s1[:2] != s2[:2]:
  28.         return 0
  29.     
  30.     key = (f1, f2)
  31.     
  32.     try:
  33.         (cs1, cs2, outcome) = cache[key]
  34.         if s1 == cs1 and s2 == cs2:
  35.             return outcome
  36.     except KeyError:
  37.         pass
  38.  
  39.     outcome = do_cmp(f1, f2)
  40.     cache[key] = (s1, s2, outcome)
  41.     return outcome
  42.  
  43.  
  44. def sig(st):
  45.     '''Return signature (i.e., type, size, mtime) from raw stat data
  46.     0-5: st_mode, st_ino, st_dev, st_nlink, st_uid, st_gid
  47.     6-9: st_size, st_atime, st_mtime, st_ctime'''
  48.     type = st[0] / 4096
  49.     size = st[6]
  50.     mtime = st[8]
  51.     return (type, size, mtime)
  52.  
  53.  
  54. def do_cmp(f1, f2):
  55.     '''Compare two files, really.'''
  56.     bufsize = 8 * 1024
  57.     fp1 = open(f1, 'rb')
  58.     fp2 = open(f2, 'rb')
  59.     while None:
  60.         b1 = fp1.read(bufsize)
  61.         b2 = fp2.read(bufsize)
  62.         if b1 != b2:
  63.             return 0
  64.         
  65.         if not b1:
  66.             return 1
  67.             continue
  68.  
  69.